using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace InverseClockWork.Extra.Cutscenes
{
    public class ReroutingDialogOverCharacterDialog : MonoBehaviour
    {
        [SerializeField]
        private RectTransform _centerPoint;
        [SerializeField]
        private UnityEngine.UI.Text _speaker, _line;

        private Text Speaker { get => _speaker; set => _speaker = value; }
        private Text Line { get => _line; set => _line = value; }
        private RectTransform CenterPoint { get => _centerPoint; set => _centerPoint = value; }


        public ReroutingDialogBehaviour Host
        {
            get; set;
        }

        private ReroutingDialogCharacterMarker Marker
        {
            get; set;
        }

        public void Config(ReroutingDialogCharacterMarker marker, string line)
        {
            Marker = marker;
            StartCoroutine(AnimatedIn(Marker.VisualName, line));

            Relocate();
        }

        private IEnumerator AnimatedIn(string speakerStr, string lineStr)
        {
            float typeSpeed = 0.01f;
            float alphaSpeed = 5.0f;

            Speaker.text = speakerStr;
            Line.text = string.Empty;

            CanvasGroup grp = GetComponentInChildren<CanvasGroup>();
            grp.alpha = 0;

            while (grp.alpha < 1)
            {
                grp.alpha += Time.deltaTime * alphaSpeed;
                yield return null;
            }

            int index = 0;
            while (index <= lineStr.Length)
            {
                //Line.text += lineStr[Line.text.Length];
                Line.text = lineStr.Substring(0, index) + "<color=#ffffff00>" + lineStr.Substring(index) + "</color>";
                index++;
                yield return new WaitForSeconds(typeSpeed);
            }
        }

        private IEnumerator AnimateOut()
        {
            float alphaSpeed = 5.0f;
            CanvasGroup grp = GetComponentInChildren<CanvasGroup>();
            while (grp.alpha > 0)
            {
                grp.alpha -= Time.deltaTime * alphaSpeed;
                yield return null;
            }
            Destroy(Host.gameObject);
            Destroy(gameObject);
        }

        private bool Removing
        {
            get; set;
        }


        private void Relocate()
        {
            Vector2 viewportPoint = Camera.main.WorldToViewportPoint(Marker.transform.position);  //convert game object position to VievportPoint

            float hMargin = 0.2f;
            float vMargin = 0.1f;

            viewportPoint.x = Mathf.Clamp(viewportPoint.x, hMargin, 1 - hMargin);
            viewportPoint.y = Mathf.Clamp(viewportPoint.y, vMargin, 1 - vMargin);

            // set MIN and MAX Anchor values(positions) to the same position (ViewportPoint)
            CenterPoint.anchorMin = viewportPoint;
            CenterPoint.anchorMax = viewportPoint;

        }

        private void Update()
        {
            //Reposition dialog box
            Relocate();

            if (Input.GetKeyDown(KeyCode.Space))
            {
                if (!Removing)
                {
                    Removing = true;
                    StartCoroutine(AnimateOut());
                }
            }
        }
    }
}